package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.EspecialidadAcademicaDAOLocal;
import pe.gob.osce.sirenas.dao.convert.EspecialidadAcademicaConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.EspecialidadAcademicaDTO;
import pe.gob.osce.sirenas.model.jpa.EspecialidadAcademica;
import pe.gob.osce.sirenas.model.jpa.rectificaciones.HistorialEspecialidadAcademica;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless
public class EspecialidadAcademicaDAOImpl implements EspecialidadAcademicaDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	@Override
	public EspecialidadAcademica insertar(EspecialidadAcademica  especialidadAcademica ) throws Exception {
		try{
			especialidadAcademica=em.merge(especialidadAcademica);
			em.flush();
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		return especialidadAcademica;
	}

	@Override
	public Boolean insertarHistorialEspecialidadAcademica(HistorialEspecialidadAcademica  historialEspecialidadAcademica ) throws Exception {
		boolean confirmacion= false;
		try {
			historialEspecialidadAcademica=em.merge(historialEspecialidadAcademica);
			em.flush();
			confirmacion=true;
		} catch (Exception e) {
			confirmacion=false;
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}		
		return confirmacion;
	}
	
	@Override 
	public List<EspecialidadAcademicaDTO>  obtenerListaExpecialidadAcademica(Long idFicha)
			throws Exception {

		List<EspecialidadAcademicaDTO> listEspecialidadAcademicaDTO=null;		
		List<EspecialidadAcademica> listaEspecialidadAcademicaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append("SELECT les FROM EspecialidadAcademica les WHERE  les.idFicha = :idFicha AND les.estado=1 ORDER BY les.indEspecialidad, les.auditoria.fechaRegistro DESC ");
						
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);
			
			
			List<EspecialidadAcademica>	listaObjeto=query.getResultList(); ;
			if(!listaObjeto.isEmpty()) {
				listaEspecialidadAcademicaJPA=new ArrayList<EspecialidadAcademica>();
				for (EspecialidadAcademica obj: listaObjeto) {
					listaEspecialidadAcademicaJPA.add(obj);
				}
				listEspecialidadAcademicaDTO=EspecialidadAcademicaConvert.createListEspecialidadAcademicaDTO(listaEspecialidadAcademicaJPA);
			}
		} catch (NoResultException nre) {
			listEspecialidadAcademicaDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listEspecialidadAcademicaDTO;
	}
	
	
	
	@Override 
	public EspecialidadAcademica consultarEspecialidadAcademica(Long idEspecialidadAcademica)
			throws Exception {
		EspecialidadAcademica		especialidadAcademicaJPA=null;
		List<EspecialidadAcademica>		listEspecialidadAcademicaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT esp FROM EspecialidadAcademica esp WHERE esp.idEspecialidad = :idEspecialidadAcademica");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idEspecialidadAcademica", idEspecialidadAcademica);
			
			List<EspecialidadAcademica> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listEspecialidadAcademicaJPA=new ArrayList<EspecialidadAcademica>();
				for (EspecialidadAcademica obj: listaObjeto) {					
					especialidadAcademicaJPA=(obj);
				}				
			}
	
		} catch (NoResultException nre) {
			especialidadAcademicaJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return especialidadAcademicaJPA;
	}	
	
	@Override 
	public List<HistorialEspecialidadAcademica> consultarHistorialEspecialidadAcademica(Long idEspecialidadAcademica)
			throws Exception {
		HistorialEspecialidadAcademica		especialidadAcademicaJPA=null;
		List<HistorialEspecialidadAcademica>		listEspecialidadAcademicaJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT esp FROM HistorialEspecialidadAcademica esp WHERE esp.idEspecialidad = :idEspecialidad");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idEspecialidad", idEspecialidadAcademica);
			
			List<HistorialEspecialidadAcademica> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listEspecialidadAcademicaJPA=new ArrayList<HistorialEspecialidadAcademica>();
				for (HistorialEspecialidadAcademica obj: listaObjeto) {					
					listEspecialidadAcademicaJPA.add(obj);
				}				
			}
		} catch (NoResultException nre) {
			listEspecialidadAcademicaJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listEspecialidadAcademicaJPA;
	}	
}
